Eventy v IB, jak je osetrit
Otázka od: Petr Selinger
26. 9. 2002 15:10
Zdravim,
resim nasledujici problem: v Databazi mam trigger, ktery
vyvola Event kdyz pribude v tabulce zaznam (After Insert).
V programu tento event odchytnu a zaznam(y) zpracuju.
Problem je, kdyz mi techto zaznamu pribude v tabulce najednou
nekolik ve shlucich. Event se nejspis vyvolava nekolikrat a ja
pak nektere zaznamy ztracim. Nacitani je reseno selectem na
tabulku, kde se vyberou vsechny zaznamy vetsi nez posledni
nactene poradove cislo.
Posloupnost:
Po vyvolani Eventu:
1. select * from tabulka where id > last_id
2. prochazim dataset a ukladam zaznamy nekam jinam
3. ziskani maximalniho cisla id z tabulky a ulozeni do last_id
Myslim si, ze kdyz se Event vyvola v jeden casovy okamzik
vicekrat, procedura se spousti paralelne a ja ztracim zaznamy.
Napadlo me to osetrit pomoci TCriticalSection, ale nejak to
nezafungovalo.
Neresil nekdo neco podobneho?
Diky, Petr
IB 6.0.1, D5 UP2
--------------------
Vyhrajte skútr Peugeot na www.superliga.cz . Založte si svůj tým a hrajte s
námi !
Odpovedá: Pavel Cisar
26. 9. 2002 17:57
Haj hou!
Reakce na udalost kterou popisujes se dela hned v eventu na komponente
TIBEvent ? Zpracovani / prijem eventu by mel byt co nejkratsi, protoze se
provadi v samostatnem vlaknu. I kdyz si ted nejsem jisty implementaci v
soucasnem IBX (nebo co pouzivas), zda nahodou nesynchronizuje osetreni do
hlavniho vlakna. Tak jako tak bych doporucil (pokud si to muzes dovolit z
casovych duvodu) nastavit pouze priznak zmeny, a skutecne zpracovani
(vyber dat atd.) provadet v OnIdle aplikace.
S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase